from unittest import TestCase
from unittest.mock import MagicMock, patch

from django_sso.backends import CASBackend
from django_sso.backends.cas_backend import get_cas_client


class CASBackendSettingsTests(TestCase):
    def setUp(self):
        from django.conf import settings

        if not settings.configured:
            settings.configure(DEBUG=True)  # pragma: no cover
        settings.CAS_VERSION = "foo"
        settings.CAS_SERVER_URL = "foo.bar"

    def test_authenticate_no_attributes(self):
        request = MagicMock()
        ticket = "mock_ticket"
        service = "foo.bar"
        mock_cas_client = MagicMock()
        mock_cas_client.verify_ticket.return_value = ("", {}, "")
        cas_backend = CASBackend()
        with (
            patch("django_sso.backends.cas_backend.get_user_model"),
            patch(
                "django_sso.backends.cas_backend.get_cas_client",
                return_value=mock_cas_client,
            ),
        ):
            _ = cas_backend.authenticate(request, ticket, service)

    def test_authenticate_user_dne(self):
        request = MagicMock()
        ticket = "mock_ticket"
        service = "foo.bar"
        mock_cas_client = MagicMock()
        mock_cas_client.verify_ticket.return_value = (
            "fake_username",
            {"foo": "bar"},
            "",
        )
        mock_user_model = MagicMock()
        mock_user_model.DoesNotExist = Exception
        mock_user_model.objects.get.side_effect = Exception
        cas_backend = CASBackend()
        with (
            patch(
                "django_sso.backends.cas_backend.get_user_model",
                return_value=mock_user_model,
            ),
            patch(
                "django_sso.backends.cas_backend.get_cas_client",
                return_value=mock_cas_client,
            ),
        ):
            _ = cas_backend.authenticate(request, ticket, service)

    def test_authenticate(self):
        request = MagicMock()
        ticket = "mock_ticket"
        service = "foo.bar"
        mock_cas_client = MagicMock()
        mock_cas_client.verify_ticket.return_value = (
            "fake_username",
            {"foo": "bar"},
            "",
        )
        cas_backend = CASBackend()
        with (
            patch("django_sso.backends.cas_backend.get_user_model"),
            patch(
                "django_sso.backends.cas_backend.get_cas_client",
                return_value=mock_cas_client,
            ),
        ):
            _ = cas_backend.authenticate(request, ticket, service)


class CASBackendTests(TestCase):
    def test_init(self):
        _ = CASBackend()

    def test_get_user(self):
        user_id = "foo"
        cas_backend = CASBackend()
        with patch("django_sso.backends.cas_backend.get_user_model"):
            _ = cas_backend.get_user(user_id)

    def test_get_user_dne(self):
        user_id = "foo"
        mock_user_model = MagicMock()
        mock_user_model.DoesNotExist = Exception
        mock_user_model.objects.get.side_effect = Exception
        cas_backend = CASBackend()
        with patch(
            "django_sso.backends.cas_backend.get_user_model",
            return_value=mock_user_model,
        ):
            _ = cas_backend.get_user(user_id)

    def test_get_cas_client(self):
        server_url = ""
        service_url = ""
        version = ""
        with patch("django_sso.backends.cas_backend.CASClient"):
            _ = get_cas_client(server_url, service_url, version)
